OT: InnoSetup a kopirovani souboru

Otázka od: Jonas Marian

27. 8. 2004 12:04

Ve svem programu pouzivam funkci, ktera zkusi na internetu najit novou verzi
programu a provest upgrade. V programu MujProgram.exe je kod pro stazeni
souboru Update.exe, ktery spustim a zaroven ukoncim MujProgram.exe pomoci
Application.Terminate. Update.exe je instalacni program vytvoreny v InnoSetup.
Na rychlych pocitacich mi naskakuje hlaska, ze soubor MujProgram.exe nelze
prepsat.

Je mozne v InnoSetup 4.2.7 nejak toto osetrit ? (vlozit nejaky flag u souboru
nebo nejakou prodlevu pred kopirovanim souboru)

Dekuji Marian


Odpovedá: Martin Schayna

27. 8. 2004 13:38

Jonas Marian wrote:
> Ve svem programu pouzivam funkci, ktera zkusi na internetu najit
> novou verzi programu a provest upgrade. V programu MujProgram.exe je
> kod pro stazeni souboru Update.exe, ktery spustim a zaroven ukoncim
> MujProgram.exe pomoci Application.Terminate. Update.exe je instalacni
> program vytvoreny v InnoSetup. Na rychlych pocitacich mi naskakuje
> hlaska, ze soubor MujProgram.exe nelze prepsat.
>
> Je mozne v InnoSetup 4.2.7 nejak toto osetrit ? (vlozit nejaky flag u
> souboru nebo nejakou prodlevu pred kopirovanim souboru)
>
> Dekuji Marian

Muzes si v [Code] sekci napr. do InitializeSetup napsat cokoliv, tj. napr.
pazourske cekani par set ms, nebo treba cekani do doby nez zanikne
urcite okno, nebo kombinace obeho (doporucuji).

Martin Schayna


Odpovedá: Ludek ZITA

27. 8. 2004 16:19

Of Martin Schayna
> Jonas Marian wrote:
> > Ve svem programu pouzivam funkci, ktera zkusi na internetu
> najit novou
> > verzi programu a provest upgrade. V programu MujProgram.exe
> je kod pro
> > stazeni souboru Update.exe, ktery spustim a zaroven ukoncim
> > MujProgram.exe pomoci Application.Terminate. Update.exe je
> instalacni
> > program vytvoreny v InnoSetup. Na rychlych pocitacich mi naskakuje
> > hlaska, ze soubor MujProgram.exe nelze prepsat.
> >
> > Je mozne v InnoSetup 4.2.7 nejak toto osetrit ? (vlozit
> nejaky flag u
> > souboru nebo nejakou prodlevu pred kopirovanim souboru)
> >
> > Dekuji Marian
>
> Muzes si v [Code] sekci napr. do InitializeSetup napsat
> cokoliv, tj. napr. pazourske cekani par set ms, nebo treba
> cekani do doby nez zanikne urcite okno, nebo kombinace obeho
> (doporucuji).

Ahoj.
Presne tak, ja to mel

Repeat
Sleep(500)
Until not FindWindow....
Sleep(500)
....

Slo by to asi i elegantneji  

Ludek


Odpovedá: Jonas Marian

30. 8. 2004 8:49

>> Jonas Marian wrote:
>> Ve svem programu pouzivam funkci, ktera zkusi na internetu
>> najit novou verzi programu a provest upgrade. V programu
>> MujProgram.exe je kod pro stazeni souboru Update.exe,
>> ktery spustim a zaroven ukoncim MujProgram.exe pomoci
>> Application.Terminate. Update.exe je instalacni program vytvoreny
>> v InnoSetup. Na rychlych pocitacich mi naskakuje hlaska, ze soubor
>> MujProgram.exe nelze prepsat.
>>
>> Je mozne v InnoSetup 4.2.7 nejak toto osetrit ?
>> Dekuji Marian

> Martin Schayna wrote:
> Muzes si v [Code] sekci napr. do InitializeSetup napsat
> cokoliv, tj. napr. pazourske cekani par set ms, nebo treba
> cekani do doby nez zanikne urcite okno, nebo kombinace obeho
> (doporucuji).

Do [Code] jsem dal tuto funkci, kterou vyvolam ve v sekci [Files]
Source: mujprogram.exe; BeforeInstall: BeforeInstall(MyProg.exe); DestDir:
{app}

[Code]
procedure BeforeInstall(s: string);
var
  i: integer;
  b: integer;
begin
  b := 0;
  ScriptDlgPageOpen;
  for i := 0 to 50 do
    begin
      if (b = 0) then
        begin
          OutputProgress('', '', i, 50);
          if Terminated then b := 2;
          if b = 0 then
            begin
              Sleep(700);
              if CheckForMutexes('MUJPROGRAM') = false then b := 1;
            end;
        end;
    end;
  ScriptDlgPageClose(True);
end;

funguje to skvele, zobrazi se progresbar, a ceka se dokud neni uvolnen
mutex. Problem je v tom, ze pokud uzivatel stiskne Storno tak se to kousne,
nevite nekdo jak to tlacitko Storno osetrit ?

Marian

Odpovedá: Martin Schayna

30. 8. 2004 11:27

Jonas Marian wrote:
> Do [Code] jsem dal tuto funkci, kterou vyvolam ve v sekci [Files]
> Source: mujprogram.exe; BeforeInstall: BeforeInstall(MyProg.exe);
> DestDir: {app}
>
> [Code]
> procedure BeforeInstall(s: string);
> var
> i: integer;
> b: integer;
> begin
> b := 0;
> ScriptDlgPageOpen;
...
> ScriptDlgPageClose(True);
> end;
>
> funguje to skvele, zobrazi se progresbar, a ceka se dokud neni uvolnen
> mutex. Problem je v tom, ze pokud uzivatel stiskne Storno tak se to
> kousne, nevite nekdo jak to tlacitko Storno osetrit ?

Tlacitko Storno muzes docasne zakazat a povolit takto:

  WizardForm.CancelButton.Enabled := False;
  ...
  WizardForm.CancelButton.Enabled := True;

Toto mi funguje s upravenou verzi InnoSetupu 3.0.6.2, doufam ze to pujde
take ve verzi 4.

Obecne si ale myslim ze vhodnejsi je se vubec nepoustet do kopirovani
souboru dokud nemas jistotu ze program jiz nebezi (tj. v InitalizeSetup).
Proti gustu ale zadny dysputat  

Martin Schayna


Odpovedá: Jonas Marian

30. 8. 2004 12:50

>> Jonas Marian wrote:
>> Do [Code] jsem dal tuto funkci, kterou vyvolam ve v sekci [Files]
>> Source: mujprogram.exe; BeforeInstall: BeforeInstall(MyProg.exe);
>> DestDir: {app}
>>
>
> Martin Schayna wrote:
> Obecne si ale myslim ze vhodnejsi je se vubec nepoustet do
> kopirovani souboru dokud nemas jistotu ze program jiz nebezi
> (tj. v InitalizeSetup).
> Proti gustu ale zadny dysputat  
>
> Martin Schayna

Nojo, ale v InitializeSetup jeste neexistuje WizardForm, a kdyz ten kod
dam do InitializeWizard, tak se mi neprekresli formular instalacniho programu a
neni videt ten progresbar.

Nakonec jsem to testovani dal do CurStepChanged pri CurStep = 2. Lze nejak
ukoncit
instalaci primo v Code sekci, nejake Terminate  

Marian


Odpovedá: Martin Schayna

30. 8. 2004 14:21

Jonas Marian wrote:
> Nojo, ale v InitializeSetup jeste neexistuje WizardForm, a kdyz ten
> kod
> dam do InitializeWizard, tak se mi neprekresli formular instalacniho
> programu a neni videt ten progresbar.
>
> Nakonec jsem to testovani dal do CurStepChanged pri CurStep = 2. Lze
> nejak ukoncit instalaci primo v Code sekci, nejake Terminate  

To je pravda, v InitializeSetup se toho moc udelat neda, max. messagebox
nebo modalni okno s naprogramovanym progressbarem. Ale CurStep 2
bude asi dobry.

Instalacku lze predcasne ukoncit takto:

procedure PostQuitMessage;
external 'PostQuitMessage@user32.dll stdcall';

procedure SetupExit;
begin
  MsgBox(cAbnormalExit, mbCriticalError, 0);
  PostQuitMessage;
end;

Martin Schayna